/* 拆点

* 本题:
    拆点，将当天餐巾拆分为旧餐巾和新餐巾两部分

    旧餐巾的来源只有一种
        当天的新餐巾

    新餐巾的去向有三种:
        1.流向下一天
        2.通过慢洗部，流向n天后，费用为s
        3.通过快洗部，流向m天后，费用为f
    
    新餐巾来源: 流出即变为旧餐巾
        1.新买的 p
        2.从n天前通过慢洗部流来
        3.从m天前通过快洗部流来

    建立虚拟源点汇点 S T 初始供应点(当天使用后得到旧餐巾) 实际使用需求(满足当天需要)
    S向所有的旧餐巾连边，容量为当天的需求量，费用为0--每天需要使用的餐巾量，且使用之后即为旧餐巾，且最多会产生当前需求量这么多的脏餐巾
     向所有的新餐巾连边，容量INF，费用为新餐巾的单价--无限购买
    旧餐巾向下一天的旧餐巾连边，容量INF，费用为0，--保留
        同时向对应的天的新餐巾连边，容量INF，费用为对应的单价 --慢洗/快洗
    新餐巾向T连边，容量为当天需求量，费用为0 --当天最多只能使用这么多新餐巾来满足需求
    S到所有新餐巾表示的点的容量足够大，故所有新餐巾表示的店到T的流量满流
    故最小费用最大流即为所求

*/

#define DEBUG
#pragma GCC optimize("O1,O2,O3,Ofast")
#pragma GCC optimize("no-stack-protector,unroll-loops,fast-math,inline")
#pragma GCC target("avx,avx2,fma")
#pragma GCC target("sse,sse2,sse3,sse4,sse4.1,sse4.2,ssse3")

#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
#define int long long
const int N = 40010, M = 8*N, INF=0x3f3f3f3f;
int day, newfee, fastday, fastfee, slowday, slowfee, S, T; //天数 新餐巾 快洗天数 快洗费用 慢洗天数 慢洗费用 虚拟源汇点
int h[N], e[M], c[M], w[M], ne[M], idx;
int q[N], pre[N], incf[N], d[N];
bool st[N];

int napkin[N];

void AddEdge(int a, int b, int cc, int ww)
{
    e[idx]=b, c[idx]=cc, w[idx]=ww, ne[idx]=h[a], h[a]=idx++;
    e[idx]=a, c[idx]=0, w[idx]=-ww, ne[idx]=h[b], h[b]=idx++;
}

bool spfa()
{
    memset(d, 0x3f, sizeof d);
    memset(incf, 0, sizeof incf);
    int hh=0, tt=0;
    q[tt++]=S, d[S]=0, incf[S]=INF;
    while(hh!=tt)
    {
        int u=q[hh++];
        if(hh==N) hh=0;
        st[u]=false;
        for(int i=h[u]; ~i; i=ne[i])
        {
            int v=e[i];
            if(c[i] && d[v]>d[u]+w[i])
            {
                d[v]=d[u]+w[i];
                pre[v]=i;
                incf[v]=min(incf[u], c[i]);
                if(!st[v])
                {
                    q[tt++]=v;
                    if(tt==N) tt=0;
                    st[v]=true;
                }
            }
        }
    }
    return incf[T]>0;
}

int EK()
{
    int cost = 0;
    while(spfa())
    {
        cost += incf[T]*d[T];
        for(int i=T; i!=S; i=e[pre[i]^1])
        {
            c[pre[i]]-=incf[T]; c[pre[i]^1]+=incf[T];
        }
    }
    return cost;
}


signed main()
{
    #ifdef DEBUG
        freopen("./in.txt","r",stdin);
    #else
        ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
    #endif

    memset(h, -1, sizeof h);

    cin >> day;
    S=0, T=2*day+1; 
    for(int i=1; i<=day; i++)
    {
        int c; cin >> c;
        AddEdge(S, i, c, 0); //每天产生旧餐巾
        AddEdge(i+day, T, c, 0); //每天需要新餐巾
    }    
    
    
    cin >> newfee >> fastday >> fastfee >> slowday >> slowfee;

    for(int i=1; i<=day; i++) //枚举入点(产生旧餐巾点)
    {
        AddEdge(S, i+day, INF, newfee); //新买的
        if(i+fastday<=day) AddEdge(i, i+day+fastday, INF, fastfee); //快洗
        if(i+slowday<=day) AddEdge(i, i+day+slowday, INF, slowfee); //快洗
        if(i+1<=day)       AddEdge(i, i+1, INF, 0); //保留到下一天  
    }
    printf("%lld\n", EK());
    return 0;
}